package com.cskaoyan.javase.basic._4precision;

/**
 * @description: 浮点数的精度问题
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * > 什么是精度问题？
 * > 计算的结果的数据类型，或者新的数据类型无法容纳全部的数据，导致部分信息被截断丢失，数据失真
 * > 专业名词就叫做“精度丢失”
 *
 * 浮点数为什么有精度问题?根源在于IEEE754标准,浮点数的表示中有尾数位,有有效数字的限制
 *      float:有效数字是7~8位
 *      double:有效数字是16~17位
 * 二进制表示的小数,会出现无限循环的情况,就像十进制10/3的小数是3.3(3的循环)
 * 以二进制表示十进制小数0.1为例子:
 * 怎么把十进制小数 --> 二进制小数:
 * 0.1 --->
 * 0.1 * 2 = 0.2 ---> 0
 * 0.2 * 2 = 0.4  ---> 0
 * 0.4 * 2 = 0.8 ---> 0
 * 0.8 * 2 = 1.6 ---> 1
 * 0.6 * 2 = 1.2 --->1
 * 0.2 * 2 = 0.4 ---> 0
 * ...
 * 无限循环
 *
 */
public class Demo {
    public static void main(String[] args) {
        //浮点数的精度问题
        double a = 1 - 0.9;
        System.out.println(a);

        float b = 1 - 0.9F;
        System.out.println(b);

        float a1 = 0.1F;
        System.out.println(a1);

        float b1 = 0.1000000000000000000001F;
        System.out.println(a1 == b1);
    }
}
